package cn.jlearn.proxy.agent.container;

import cn.jlearn.proxy.agent.handler.TcpForwardClientHandler;
import cn.jlearn.proxy.agent.listener.TcpForwardClientListener;
import cn.jlearn.proxy.common.container.ClientContainer;
import org.tio.client.ClientChannelContext;
import org.tio.client.ClientTioConfig;
import org.tio.client.TioClient;
import org.tio.client.intf.ClientAioHandler;
import org.tio.client.intf.ClientAioListener;
import org.tio.core.Node;
import org.tio.core.Tio;

/**
 * @author qianyingchao
 * @version 1.0
 * @date 2021/5/10 4:17 下午
 */
public class TcpForwardClient extends ClientContainer {

    public static volatile ClientTioConfig clientTioConfig;

    public TcpForwardClient(String host, Integer port, String bsId) {
        super(host, port, bsId);
    }

    @Override
    public void startClient(String host, Integer port, String bsId) throws Exception {
        ClientAioHandler handler = new TcpForwardClientHandler();
        ClientAioListener listener = new TcpForwardClientListener();

        if (clientTioConfig == null) {
            synchronized (TcpForwardClient.class) {
                if (clientTioConfig == null) {
                    clientTioConfig = new ClientTioConfig(handler, listener, null);
                    clientTioConfig.setHeartbeatTimeout(0);
                }
            }
        }

        TioClient tioClient = new TioClient(clientTioConfig);
        ClientChannelContext clientChannelContext = tioClient.connect(new Node(host, port));
        clientChannelContext.set("bsId", bsId);
        Tio.bindBsId(clientChannelContext, bsId);
    }

}
